# 一个潜水队进行日常训练，教练会记录队员每次潜水的数据，现在需要统计筛选出每次潜水都达到一个指定的深度。

import pandas as pd

# 数据
df = pd.DataFrame({
    'name': list('aaabbcc'),
    'deep': [-2, -3, -5, -6, -2, -5, -5]
})
print(df)  # 其中 name 是潜水员的名称，deep 为潜水深度，此为伪造数据。

"""
由于源数据是一个平铺的数据，要得到每个队员的数据，就需要对数据按队员进行分组。
分组后，取得每个组（每个队员）的成绩，让这个队员的成绩都小于一个值，
这里可以用 all 方法进行操作，如果所有值满足表达式会为 True。
通过 all 得到的布尔序列里我们选择为 True 的数据，就是满足条件的队员。

最后用 loc 对原数据进行筛选，条件表达可以用 df.name.isin()。
"""
print(df.groupby("name").apply(lambda x: x["deep"]))

# 接上，分组后每个运动员所有的成绩小于 n，n = -4
selected = df.groupby('name').apply(lambda x: (x.deep < -4).all())
print(selected)

# 接上，筛选出符合的用户
print(selected[selected].index)  # Index(['c'], dtype='object', name='name')
print(df.name.isin(selected[selected].index.tolist()))
# 最终筛选结果
print(df.loc[df.name.isin(selected[selected].index.tolist())])

# 另外，如果选择出相反的数据，在条件表达式前加 ～ 即可
print(df.loc[~df.name.isin(selected[selected].index.tolist())])
